package frame;

import utility.JavaUtility;


public class FrameTimer
{
	/** 1フレーム辺りの所要時間 */
	private static final long IDEAL_WAIT_TIME = 1000 / 30;

	/** 前のフレームでの時間 */
	private long 	m_prevTime;

	/**
	 * コンストラクタ
	 *
	 * @param fps　フレーム数
	 */
	public FrameTimer()
	{

		m_prevTime = System.currentTimeMillis();
	}

	/**
	 * 更新
	 */
	public void update()
	{
		// １フレームの処理時間
		long frameTime = getCurrentTime();

		// 処理待ち
		taskWait( frameTime );

		// 時間の更新
		m_prevTime = System.currentTimeMillis();
	}

	/**
	 * 処理待ちを行う
	 *
	 * @param frameTime　1フレームの処理時間
	 */
	private void taskWait( long frameTime )
	{
		// 待ち時間
		long waitTime = IDEAL_WAIT_TIME - frameTime;

		// 待ち時間がマイナスの場合待ちなし
		if( waitTime < 0 )
		{
			return;
		}

		// 処理停止
		sleep();
	}

	/**
	 * 停止時間の割り出しを行い処理を停止させる
	 */
	private void sleep()
	{
		long currentTime = getCurrentTime();

		// スリープだけだとCPUによりちゃんと待つのかが不安なので
		// whileで時間経過したかのチェックも行う
		while( IDEAL_WAIT_TIME > currentTime )
		{
			//
			JavaUtility.sleep( IDEAL_WAIT_TIME - currentTime );

			currentTime = getCurrentTime();
		}
	}

	/**
	 * 現在の経過時間を計測する
	 *
	 * @return 前のフレームから現在までの経過時間
	 */
	private long getCurrentTime()
	{
		return System.currentTimeMillis() - m_prevTime;
	}
}